package com.shunli.cterminal.model.dto;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.examples.core.exception.ServiceException;
import com.shunli.cterminal.model.code.CterminalResultCode;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 描述
 * </p>
 *
 * @author daodao
 * @since 2025-04-29 17:05
 */
@Data
public class PolicyPriceJsonDTO implements Serializable {
    private static final long serialVersionUID = -8724795874147330936L;

    @Schema(description = "价格列表")
    private List<PolicyPriceInterval> priceIntervalList;

    // 默认
    public static String getDefaultPolicyPriceJson() {
        PolicyPriceJsonDTO policyPriceJsonDTO = new PolicyPriceJsonDTO();
        policyPriceJsonDTO.setPriceIntervalList(new ArrayList<>());
        PolicyPriceInterval policyPriceInterval = new PolicyPriceInterval();
        policyPriceInterval.setStartPrice(new BigDecimal(0));
        policyPriceInterval.setEndPrice(new BigDecimal(25));
        policyPriceJsonDTO.getPriceIntervalList().add(policyPriceInterval);
        return JSONObject.toJSONString(policyPriceJsonDTO);
    }

    /**
     * 参数校验
     *
     * @param policyPriceJsonDTO 参数
     * @return boolean
     */
    public static void checkParams(PolicyPriceJsonDTO policyPriceJsonDTO) {
        if (ObjectUtil.hasNull(policyPriceJsonDTO, policyPriceJsonDTO.getPriceIntervalList())) {
            throw new ServiceException(CterminalResultCode.PARAMS_EMPTY);
        }
        List<PolicyPriceInterval> priceIntervalList = policyPriceJsonDTO.getPriceIntervalList();

        for (int i = 0; i < priceIntervalList.size() - 1; i++) {
            PolicyPriceInterval priceInterval = priceIntervalList.get(i);
            if (ObjectUtil.hasEmpty(priceInterval.getStartPrice(), priceInterval.getEndPrice())) {
                throw new ServiceException(CterminalResultCode.PARAMS_EMPTY);
            }
            BigDecimal startPrice = priceInterval.getStartPrice();
            BigDecimal endPrice = priceInterval.getEndPrice();
            if (NumberUtil.isGreaterOrEqual(startPrice, endPrice)) {
                throw new ServiceException(CterminalResultCode.ACTIVITY_START_TIME_AFTER_END);
            }

            for (int j = i + 1; j < priceIntervalList.size(); j++) {
                PolicyPriceInterval priceIntervalItem = priceIntervalList.get(j);
                BigDecimal targetStartPrice = priceIntervalItem.getStartPrice();
                BigDecimal targetEndPrice = priceIntervalItem.getEndPrice();
                boolean isInRangeStartPrice = (NumberUtil.isGreaterOrEqual(targetStartPrice, startPrice) && NumberUtil.isLess(targetStartPrice, endPrice));
                boolean isInRangeEndPrice = (NumberUtil.isGreaterOrEqual(targetEndPrice, startPrice) && NumberUtil.isLess(targetEndPrice, endPrice));
                if (isInRangeStartPrice || isInRangeEndPrice) {
                    String message = StrUtil.format("[{},{}] 和 [{},{}] 规则价格重叠", priceInterval.getStartPrice(), priceInterval.getEndPrice(), priceIntervalItem.getStartPrice(), priceIntervalItem.getEndPrice());
                    throw new ServiceException(CterminalResultCode.GENERIC_CUSTOM_ERROR_MESSAGE, message);
                }
            }
        }
    }

    /**
     * 价格区间
     */
    @Data
    public static class PolicyPriceInterval implements Serializable {

        private static final long serialVersionUID = -7187447097372144669L;
        @Schema(description = "最低价格")
        private BigDecimal startPrice;
        @Schema(description = "最高价格")
        private BigDecimal endPrice;
    }
}
